package com.it.myh;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Description: // 类说明，在创建类时要填写
 * @ClassName: Ev_0220_03    // 类名，会自动填充
 * @Author: MYH          // 创建者
 * @Date: 2023/2/20 11:40   // 时间
 * @Version: 1.0     // 版本
 */
class Person1{

    private String name;

    public Integer age;

    public Person1() {
    }

    private Person1(String name) {
        this.name = name;
    }

    public Person1(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public void show(){
        System.out.println("你好！");
    }

    private String showNation(String nation){
        System.out.println("我的国籍是：" + nation);
        return nation;
    }
}
public class Ev_0220_03 {

    public static void main(String[] args) throws Exception {

        //反射之前，对于person类的操作
        //在person类内部，不可以通过person类对象调用其内部私有的结构。
        //1.实例化person
        Person1 tom = new Person1("tom", 12);
        //2.通过对象，调用其内部的属性，方法
        tom.age = 10;
        System.out.println(tom);
        tom.show();

        //反射之后，对于person类的操作

        Class clazz = Person1.class;
        //1.通过反射，创建Person1类的对象
        Constructor cons = clazz.getConstructor(String.class, Integer.class);
        Object obj = cons.newInstance("MYH", 12);
        Person1 p = (Person1) obj;
        //2.通过反射，调用对象指定的属性、方法
        //在person类内部，可以通过person类对象调用其内部私有的结构。
        //调属性
        Field age = clazz.getDeclaredField("age");
        age.set(p,1000);
        System.out.println(p);
        //调方法
        Method show = clazz.getDeclaredMethod("show");
        show.invoke(p);
        //通过反射，调用其内部私有的结构
        //通过反射，调用私有构造器
        Constructor cons1 = clazz.getDeclaredConstructor(String.class);
        cons1.setAccessible(true);
        Person1 p1 = (Person1) cons1.newInstance("Jerry");
        System.out.println(p1);
        //通过反射，调用私有属性
        Field name = clazz.getDeclaredField("name");
        name.setAccessible(true);
        name.set(p1,"已经改名了");
        //通过反射，调用私有方法
        Method showNation = clazz.getDeclaredMethod("showNation",String.class);
        showNation.setAccessible(true);
        Object 中国 = showNation.invoke(p1, "中国");
        System.out.println(中国);
    }
}
